// 引入express模块
const express = require("express")
// 引入cors模块
const cors = require("cors")
// 引入path模块
const path = require("path")

// 导入jsonwebtoken,生成jwt字符串的模块
const jwt = require("jsonwebtoken")
// 导入express-jwt,将前端发送过来的jwt字符串,解析还原成json对象的模块
// 低版本直接引入,高版本需要解构const {expressJWT} = require("express-jwt")
const expressJWT = require("express-jwt")
// 获取密钥
const { secretKey } = require("./auth/config.js")
// 导入Response
const Response = require("./utils/ResponseData.js")
const states = require("./utils/States.js")

// 创建服务
const app = new express()

// 配置JWT拦截规则
// unless()配置不需要做身份鉴权的路由地址
app.use(expressJWT({ secret: secretKey, algorithms: ["HS256"] }).unless({
    path: [
        "/adminLogin",
        "/userLogin",
        "/checkEmail",
        "/sendCode",
        "/checkCode",
        "/register",
    ]
}))

// 引入中间件
// 所有的中间件都是在服务器下编写,所有的路由都可以用到浏览器
// 浏览器先请求,中间件拦截,然后将请求的数据处理解析

// 启动服务器
// 3000是服务端端口号
// 默认启动服务器的命令node app.js
app.listen(3000, () => console.log("服务器启动成功", "http://localhost:3000"))
// 配置跨域请求中间件
app.use(cors({
    // 允许跨域的服务器地址,可以写多个(就是vue工程的服务地址)
    // origin: "*"
    credentials: true
}))
// 配置内容解析器
const bodyParser = require("express")
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

// 使用错误处理中间件,拦截所有路由中抛出的异常
app.use((err, req, res, next) => {
    // token校验不通过提示
    if (err.name = "UnauthorizedError") {
        console.log(err);
        return res.send(Response.error("token已失效,重新登录", states.AUTH_ERROR))
    }
    // 打印异常
    console.log("异常信息:", err);
    // 设置http响应的状态码,响应到前端
    res.send(Response.error("服务器异常,重新访问", 500))
    next()
})

// 导入相关路由文件
const petAdmin = require("./routes/admin/petAdmin.js")
const petBuiness = require("./routes/admin/petBusiness.js")
const petDiary = require("./routes/admin/petDiary.js")
const petOrder = require("./routes/admin/petOrder.js")
const petUser = require("./routes/admin/petUser.js")

const login = require("./routes/user/login.js")
const register = require("./routes/user/register.js")
const diary = require("./routes/user/diary.js")
const business = require("./routes/user/business.js")
const contact = require("./routes/user/contact.js")
const pet = require("./routes/user/pet.js")
const order = require("./routes/user/order.js")

app.use(petAdmin)
app.use(petBuiness)
app.use(petDiary)
app.use(petOrder)
app.use(petUser)
app.use(login)
app.use(register)
app.use(diary)
app.use(business)
app.use("/contact", contact)
app.use("/pet", pet)
app.use("/order", order)



// 托管静态资源文件
app.use(express.static("./public"))
app.use(express.static(path.join(__dirname, "public")))

// 拦截前端请求错误
const history = require("connect-history-api-fallback")
app.use(history())